package common

import (
	"net"
	"net/http"
	"strings"
)

func GetClientIP(r *http.Request) string {
	// 首先尝试从X-Forwarded-For头部获取IP
	// 注意：X-Forwarded-For可能被伪造，或者包含多个IP（经过多个代理）
	// 通常第一个IP是原始客户端的IP
	forwarded := r.Header.Get("X-Forwarded-For")
	if forwarded != "" {
		// 使用strings.SplitN来避免分割字符串时超出预期
		// 这里假设只需要第一个IP
		ips := strings.SplitN(forwarded, ",", 2)
		return strings.TrimSpace(ips[0])
	}

	// 如果没有X-Forwarded-For，则尝试从X-Real-IP获取
	realIP := r.Header.Get("X-Real-IP")
	if realIP != "" {
		return realIP
	}

	// 最后，如果以上都没有，则使用RemoteAddr
	// 注意：RemoteAddr可能包含端口号，如[::1]:58234，需要分割
	// 这里我们假设没有IPv6的情况，简单以":"分割
	host, _, err := net.SplitHostPort(r.RemoteAddr)
	if err != nil {
		return r.RemoteAddr // 如果分割出错，则直接使用RemoteAddr
	}
	return host
}
